use anyhow::Result;
use std::process::{Command, Stdio};
use std::thread;
use std::time::Duration;

mod ftp_client_test;
use ftp_client_test::FtpTestClient;

/// FTP服务器测试套件
pub struct FtpTestSuite {
    server_process: Option<std::process::Child>,
}

impl FtpTestSuite {
    pub fn new() -> Self {
        Self {
            server_process: None,
        }
    }
    
    /// 启动FTP服务器
    pub fn start_server(&mut self) -> Result<()> {
        println!("🚀 启动FTP服务器...");
        
        // 构建服务器
        let build_result = Command::new("cargo")
            .args(&["build", "-p", "ftp-server"])
            .output()?;
        
        if !build_result.status.success() {
            let error = String::from_utf8_lossy(&build_result.stderr);
            return Err(anyhow::anyhow!("构建失败: {}", error));
        }
        
        // 启动服务器进程
        let server_process = Command::new("cargo")
            .args(&["run", "-p", "ftp-server", "--", "--port", "2121"])
            .stdout(Stdio::piped())
            .stderr(Stdio::piped())
            .spawn()?;
        
        self.server_process = Some(server_process);
        
        // 等待服务器启动
        println!("⏳ 等待服务器启动...");
        thread::sleep(Duration::from_secs(3));
        
        println!("✅ FTP服务器已启动 (端口: 2121)");
        Ok(())
    }
    
    /// 停止FTP服务器
    pub fn stop_server(&mut self) -> Result<()> {
        if let Some(mut process) = self.server_process.take() {
            println!("🛑 停止FTP服务器...");
            process.kill()?;
            process.wait()?;
            println!("✅ FTP服务器已停止");
        }
        Ok(())
    }
    
    /// 运行连接测试
    pub fn test_connection(&self) -> Result<()> {
        println!("\n=== 测试服务器连接 ===");
        
        match FtpTestClient::connect("localhost", 2121) {
            Ok(mut client) => {
                println!("✅ 成功连接到FTP服务器");
                
                // 读取欢迎消息
                let welcome = client.read_response()?;
                println!("服务器欢迎消息: {}", welcome);
                
                // 测试QUIT命令
                client.send_command("QUIT")?;
                client.expect_response(221)?;
                
                println!("✅ 连接测试通过");
                Ok(())
            }
            Err(e) => {
                println!("❌ 连接失败: {}", e);
                Err(e)
            }
        }
    }
    
    /// 运行认证测试
    pub fn test_authentication(&self) -> Result<()> {
        println!("\n=== 测试用户认证 ===");
        
        let mut client = FtpTestClient::connect("localhost", 2121)?;
        
        // 读取欢迎消息
        client.read_response()?;
        
        // 测试无效用户名
        println!("测试无效用户名...");
        client.send_command("USER invaliduser")?;
        client.expect_response(331)?; // User name okay, need password
        
        client.send_command("PASS wrongpass")?;
        match client.expect_response(530) {
            Ok(_) => println!("✅ 无效认证正确被拒绝"),
            Err(_) => println!("❌ 无效认证未被正确拒绝"),
        }
        
        // 测试有效用户（如果存在）
        println!("测试有效用户...");
        client.send_command("USER testuser")?;
        client.expect_response(331)?;
        
        client.send_command("PASS testpass")?;
        match client.expect_response(230) {
            Ok(_) => println!("✅ 有效认证成功"),
            Err(_) => println!("❌ 有效认证失败（可能需要先创建用户）"),
        }
        
        client.send_command("QUIT")?;
        client.expect_response(221)?;
        
        Ok(())
    }
    
    /// 运行命令测试
    pub fn test_commands(&self) -> Result<()> {
        println!("\n=== 测试FTP命令 ===");
        
        let mut client = FtpTestClient::connect("localhost", 2121)?;
        
        // 读取欢迎消息
        client.read_response()?;
        
        // 测试各种命令
        client.test_system_info()?;
        client.test_transfer_modes()?;
        client.test_pasv()?;
        client.test_port()?;
        
        // 测试未认证的命令（应该被拒绝）
        println!("\n=== 测试未认证命令 ===");
        client.send_command("PWD")?;
        match client.expect_response(530) {
            Ok(_) => println!("✅ 未认证命令正确被拒绝"),
            Err(_) => println!("❌ 未认证命令未被正确拒绝"),
        }
        
        client.send_command("QUIT")?;
        client.expect_response(221)?;
        
        Ok(())
    }
    
    /// 运行完整测试
    pub fn run_full_test(&mut self) -> Result<()> {
        println!("🧪 开始FTP服务器完整测试");
        
        // 启动服务器
        self.start_server()?;
        
        // 运行各种测试
        self.test_connection()?;
        self.test_authentication()?;
        self.test_commands()?;
        
        // 停止服务器
        self.stop_server()?;
        
        println!("🎉 所有测试完成！");
        Ok(())
    }
}

fn main() -> Result<()> {
    let mut test_suite = FtpTestSuite::new();
    test_suite.run_full_test()
}
